package DataAccess;


import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;




//<p>Class description: Classe per la creazione del Db e delle tabelle</p>

/**
 * Classe che si occupa di creare il DB nel caso esso non esiste.
 */
public class CreateDatabase {
    
    /*Stringhe per la creazione del db*/
    private static String dropDb = "DROP database IF EXISTS ";
    private static String createDb = "CREATE database IF NOT EXISTS ";
    
    private static String associations_ca_entity =//"DROP TABLE IF EXISTS `associations_ca_entity`;" +
            "CREATE TABLE IF NOT EXISTS `associations_ca_entity` (" +
            "`Commarea` varchar(45) NOT NULL default ''," +
            "`DAM_BC` varchar(45) NOT NULL default ''," +
            "`Entity` varchar(145) default NULL," +
            "`Path` varchar(145) default NULL," +
            "PRIMARY KEY  (`Commarea`,`DAM_BC`)" +
            ") ENGINE=InnoDB DEFAULT CHARSET=latin1;";
    
    private static String commarea =  //"DROP TABLE IF EXISTS `commarea`;" +
            "CREATE TABLE IF NOT EXISTS `commarea` ("+
            "`ID` int(10) unsigned NOT NULL auto_increment," +
            "`VarName` varchar(200) NOT NULL default ''," +
            "`VarPath` varchar(200) NOT NULL default ''," +
            "`VarType` varchar(200) NOT NULL default ''," +
            "`source` int(10) unsigned NOT NULL default '0'," +
            "`GestioneErrore` int(10) unsigned NOT NULL default '0'," +
            "PRIMARY KEY  (`ID`)" +
            ") ENGINE=InnoDB DEFAULT CHARSET=latin1;";
    
    private static String commareaxentity = //"DROP TABLE IF EXISTS `commareaxentity`;" +
            "CREATE TABLE IF NOT EXISTS `commareaxentity` (" +
            "`ID_Commarea` int(10) unsigned NOT NULL default '0'," +
            "`ID_Entity` int(10) unsigned NOT NULL default '0'," +
            "`percorso` varchar(200) NOT NULL default ''," +
            "PRIMARY KEY  (`ID_Commarea`,`ID_Entity`)," +
            "KEY `FK_commareaxentity_2` (`ID_Entity`)," +
            "CONSTRAINT `commareaxentity_ibfk_1` FOREIGN KEY (`ID_Commarea`) REFERENCES `commarea` (`ID`)," +
            "CONSTRAINT `commareaxentity_ibfk_2` FOREIGN KEY (`ID_Entity`) REFERENCES `entity` (`ID_entity`)" +
            ") ENGINE=InnoDB DEFAULT CHARSET=latin1;";
    
    
    private static String entity =  //"DROP TABLE IF EXISTS `entity`;" +
            "CREATE TABLE IF NOT EXISTS `entity` (" +
            "`ID_entity` int(10) unsigned NOT NULL auto_increment," +
            "`PackageName` varchar(145) NOT NULL default ''," +
            "`ClassName` varchar(145) NOT NULL default ''," +
            "`PropertyName` varchar(145) NOT NULL default ''," +
            "`PropertyType` varchar(145) NOT NULL default ''," +
            "`Annotation` varchar(145) NOT NULL default ''," +
            "PRIMARY KEY  (`ID_entity`)" +
            ") ENGINE=InnoDB DEFAULT CHARSET=latin1;";
    
    
    
    
    
    private static String lookup =  //"DROP TABLE IF EXISTS `lookup`;" +
            "CREATE TABLE IF NOT EXISTS `lookup` (" +
            "`ID` int(10) unsigned NOT NULL auto_increment," +
            "`SourceName` varchar(145) default NULL," +
            "`SourceType` varchar(145) default NULL," +
            "`ProductName` varchar(145) default NULL," +
            "`InterfaceName` varchar(145) default NULL," +
            "`InterfacePackageName` varchar(145) default NULL," +
            "`DaoName` varchar(145) default NULL," +
            "`DaoPackageName` varchar(145) default NULL," +
            "`CommareaName` varchar(145) default NULL," +
            "`CommAreaPackageName` varchar(145) default NULL," +
            "`DestinationFolder` varchar(145) default NULL," +
            "`Metodo` varchar(145) default NULL," +
            "`BeanName` varchar(145) default NULL," +
            "`BCPackageName` varchar(145) default NULL," +
            "PRIMARY KEY  (`ID`)" +
            ") ENGINE=InnoDB DEFAULT CHARSET=latin1 ROW_FORMAT=DYNAMIC;";
    
    
    private static String paginazionecursor =   //"DROP TABLE IF EXISTS `paginazionecursor`;" +
            "CREATE TABLE IF NOT EXISTS `paginazionecursor` (" +
            "`ID` int(10) unsigned NOT NULL auto_increment," +
            "`IDCommareaVariable` int(10) unsigned NOT NULL default '0'," +
            "`NomeQuery` varchar(200) NOT NULL default ''," +
            "`Vettore` varchar(200) NOT NULL default ''," +
            "`ClassexVettore` varchar(200) NOT NULL default ''," +
            "PRIMARY KEY  (`ID`)," +
            "KEY `FK_PaginazioneCursor_1` (`IDCommareaVariable`)," +
            "CONSTRAINT `paginazionecursor_ibfk_1` FOREIGN KEY (`IDCommareaVariable`) REFERENCES `commarea` (`ID`) ON DELETE CASCADE ON UPDATE CASCADE" +
            ") ENGINE=InnoDB DEFAULT CHARSET=latin1;";
    
    
    private static String report =  //"DROP TABLE IF EXISTS `report`;" +
            "CREATE TABLE IF NOT EXISTS `report` (" +
            "`id` int(10) unsigned NOT NULL auto_increment," +
            "`SourcePath` varchar(200) NOT NULL default ''," +
            "`SourceName` varchar(200) NOT NULL default ''," +
            "`SourceType` varchar(200) NOT NULL default ''," +
            "`SourceAnn` varchar(200) NOT NULL default ''," +
            "`DestPath` varchar(200) NOT NULL default ''," +
            "`DestName` varchar(200) NOT NULL default ''," +
            "`DestType` varchar(200) NOT NULL default ''," +
            "`Entity` varchar(200) NOT NULL default ''," +
            "`Metodo` varchar(200) NOT NULL default ''," +
            "`Package` varchar(200) NOT NULL default ''," +
            "`DestAnn` varchar(200) NOT NULL default ''," +
            "PRIMARY KEY  (`id`)" +
            ") ENGINE=InnoDB DEFAULT CHARSET=latin1;";
    
    
    private static String nomeDb;
    private static String utenteDb;
    private static String passwordDb;
    private static String urlDb;
    
    private static Connection connection;
    
        /*
         * Apre la connessione con MySql attraverso url, nome utente e password.
         * Il database non � ancora stato creato.Il metodo serve appunto
         * per accedere a MySql e andare a creare un database con un nome
         * inserito dall'utente.
         */
    /**
     * Permette la connessione al DB
     * @throws java.sql.SQLException Lancia eccezione nel caso di problemi con il codice SQL
     * @throws java.lang.InstantiationException Lancia l'eccezione in caso di problemi nell'istanzazione delle classi dei driver del JDBC
     * @throws java.lang.IllegalAccessException Lancia l'eccezione nel caso di utente e password errati
     * @throws java.io.IOException Lancia l'eccezione nel caso di problemi di I/O
     */
    public static void connettiDb()throws SQLException, InstantiationException, IllegalAccessException, IOException{
        try {
            Class.forName("com.mysql.jdbc.Driver").newInstance();
            connection = DriverManager.getConnection(urlDb+"?user="+utenteDb+"&password="+passwordDb);
        } 		catch (ClassNotFoundException cnfex){
            dbException(0,cnfex.getClass().toString());
            System.exit(1);
        } catch(SQLException sqlex){
            dbException(1,sqlex.getClass().toString());
            System.exit(1);
        } catch (InstantiationException iex) {
            dbException(2,iex.getClass().toString());
        } catch (IllegalAccessException iaex) {
            dbException(3,iaex.getClass().toString());
        }
        
    }
    
        /*
         * Chiude la connessione con il DB
         */
    /**
     * Chiude la connessione col DB
     */
    public static void disconnettiDb() {
        try {
            connection.close();
        } catch (SQLException e) {
            dbException(4,e.getClass().toString());
        }
        
    }
    
        /*
         * Elimina eventuali database con nome uguale a quello scelto
         * dall'utente per Script Manager
         * @return result(eliminazione avvenuta/non avvenuta)
         */
    /**
     * Elimina il DB
     * @return True se l'operazione � andata a buon fine, False altrimenti
     * @throws java.sql.SQLException Lancia eccezione nel caso di problemi con il codice SQL
     * @throws java.lang.InstantiationException Lancia l'eccezione in caso di problemi nell'istanzazione delle classi dei driver del JDBC
     * @throws java.lang.IllegalAccessException Lancia l'eccezione nel caso di utente e password errati
     * @throws java.io.IOException Lancia l'eccezione nel caso di problemi di I/O
     */
    public static boolean eliminaDatabase() throws SQLException, InstantiationException, IllegalAccessException, IOException{
        connettiDb();
        
        Statement statement;
        int result = 0;
        
        try{
            statement = connection.createStatement();
            result = statement.executeUpdate(dropDb+nomeDb);
            statement.close();
        } catch (SQLException e) {
            dbException(5,e.getClass().toString());
        }
        disconnettiDb();
        if (result == 0) return true;
        else return false;
    }
    
        /*
         * Crea il database con il nome specificato dall'utente
         * @return result(creazione avvenuta/non avvenuta)
         */
    /**
     * Crea il database
     * @return True se l'operazione � andata a buon fine, False altrimenti
     * @throws java.sql.SQLException Lancia eccezione nel caso di problemi con il codice SQL
     * @throws java.lang.InstantiationException Lancia l'eccezione in caso di problemi nell'istanzazione delle classi dei driver del JDBC
     * @throws java.lang.IllegalAccessException Lancia l'eccezione nel caso di utente e password errati
     * @throws java.io.IOException Lancia l'eccezione nel caso di problemi di I/O
     */
    public static boolean creaDatabase() throws SQLException, InstantiationException, IllegalAccessException, IOException{
        connettiDb();
        
        Statement statement;
        int result = 0;
        
        try{
            statement = connection.createStatement();
            result = statement.executeUpdate(createDb+nomeDb);
            statement.close();
        } catch (SQLException e) {
            dbException(6,e.getClass().toString());
        }
        disconnettiDb();
        if (result == 0) return true;
        else return false;
    }
    
        /*
         * Crea le tabelle del database e popola la tabella linguaggio
         * @return result(creazione tabelle avvenuta/non avvenuta)
         */
    /**
     * Crea le tavole del DB
     * @return True se l'operazione � andata a buon fine, False altrimenti
     * @throws java.sql.SQLException Lancia eccezione nel caso di problemi con il codice SQL
     * @throws java.lang.InstantiationException Lancia l'eccezione in caso di problemi nell'istanzazione delle classi dei driver del JDBC
     * @throws java.lang.IllegalAccessException Lancia l'eccezione nel caso di utente e password errati
     * @throws java.io.IOException Lancia l'eccezione nel caso di problemi di I/O
     */
    public static boolean creaTabelle() throws SQLException, InstantiationException, IllegalAccessException, IOException{
        connettiDb();
        
        Statement statement;
        int result = 0; //se 0 l'inserimento � avvenuto
        
        try{
            statement = connection.createStatement();
            result = statement.executeUpdate("use "+nomeDb+";");
            statement.close();
            
            try{
                statement = connection.createStatement();
                result = statement.executeUpdate(associations_ca_entity);
                result = statement.executeUpdate(commarea);
                result = statement.executeUpdate(entity);
                result = statement.executeUpdate(commareaxentity);
                result = statement.executeUpdate(lookup);
                result = statement.executeUpdate(paginazionecursor);
                result = statement.executeUpdate(report);
                
                statement.close();
            } catch (SQLException e) {
                e.printStackTrace();
                dbException(7,e.getClass().toString());
            }
            
            
        } catch (SQLException e) {
            dbException(8,e.getClass().toString());
        }
        disconnettiDb();
        if (result == 0) return true;
        else return false;
    }
    /**
     * Elimina il DB, crea il DB e infine crea le tavole.
     * @param pw Passoword dell'utente
     * @param url Url deel DB
     * @param utente Nome utente
     * @param nome Nome del DB
     * @throws java.sql.SQLException Lancia eccezione nel caso di problemi con il codice SQL
     * @throws java.lang.InstantiationException Lancia l'eccezione in caso di problemi nell'istanzazione delle classi dei driver del JDBC
     * @throws java.lang.IllegalAccessException Lancia l'eccezione nel caso di utente e password errati
     * @throws java.io.IOException Lancia l'eccezione nel caso di problemi di I/O
     */
    public static void inizializzaValori(String pw,String url,String utente, String nome) throws SQLException, InstantiationException, IllegalAccessException, IOException {
        passwordDb=pw;
        urlDb=url;
        utenteDb=utente;
        nomeDb=nome;
        try{
            eliminaDatabase();
            creaDatabase();
            creaTabelle();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    /**
     * Verifica la connessione col DB
     * @param passwordDb Password 
     * @param urlDb Url del DB
     * @param utenteDb Nome utente
     * @return True se la connessione � stata effettuata, False altrimenti
     * @throws java.sql.SQLException Lancia eccezione nel caso di problemi con il codice SQL
     * @throws java.lang.InstantiationException Lancia l'eccezione in caso di problemi nell'istanzazione delle classi dei driver del JDBC
     * @throws java.lang.IllegalAccessException Lancia l'eccezione nel caso di utente e password errati
     * @throws java.io.IOException Lancia l'eccezione nel caso di problemi di I/O
     */
    public static boolean verifyConnectionDb(String passwordDb,String urlDb,String utenteDb)throws SQLException, InstantiationException, IllegalAccessException, IOException{
        try {
            Class.forName("com.mysql.jdbc.Driver").newInstance();
            
            connection = DriverManager.getConnection(urlDb+"?user="+utenteDb+"&password="+passwordDb);
            
            disconnettiDb();
            return true;
        } 		catch (ClassNotFoundException cnfex){
            dbException(0,cnfex.getClass().toString());
            System.exit(1);
            return false;
        } catch(SQLException sqlex){
            dbException(1,sqlex.getClass().toString());
            System.exit(1);
            return false;
        } catch (InstantiationException iex) {
            dbException(2,iex.getClass().toString());
            return false;
        } catch (IllegalAccessException iaex) {
            dbException(3,iaex.getClass().toString());
            return false;
        }
        
    }
    
        /*
         * Si occupa della gestione degli errori.
         */
    /**
     * Permette di visualizzare un messaggio di errore all'utente nel caso di problemi col le operazioni riguardanti il DB
     * @param errCode Codice errore
     * @param code Descrizione errore
     */
    public static void dbException(int errCode,String code){
        //new eMessage(errCode,code);
    }
}
